/*Copyright (C) 2009 - 2011 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

/* Fonction affichant l'écran de jeu
*/

#include "../headers.h"

void pou_display_game(POU_CASE_T matrix[POU_MAT_X][POU_MAT_Y], POU_INF_T *inf) {
	clear();
	/* Titre */
	afficher_titre(TITRE_POUSSE_CAISSE);
	/* Matrice */
	pou_display_matrix(matrix);
	/* Information sur le jeu */
	move(27, x_begin_center(50) - 27);
	CSLP_ColorText(COLOR_RED);
	afficher_char_bullet(1);
	CSLP_ColorText(CT);
	addstr("Jeu :\n");
	getyx(stdscr, inf->pos_inf.y, inf->pos_inf.x);
	pou_refresh_inf(inf);
	addch('\n');
	/* Legende */
	pou_display_legend();
	/* Liste des touches */
	move(14, x_begin_center(50) - 27);
	CSLP_ColorText(COLOR_RED);
	afficher_char_bullet(1);
	CSLP_ColorText(CT);
	addstr("Liste des touches :");
	CSLP_ColorText(COLOR_RED);
	mvprintw(15, x_begin_center(50) - 25, "%c",  POU_KEY_QUIT);
	CSLP_ColorText(CT);
	addstr(" : quitter");
	CSLP_ColorText(COLOR_RED);
	mvprintw(16, x_begin_center(50) - 25, "%c", POU_KEY_RESTART);
	CSLP_ColorText(CT);
	addstr(" : recommencer");
	CSLP_ColorText(COLOR_RED);
	mvprintw(17, x_begin_center(50) - 25, "%c", POU_KEY_UNDO);
	CSLP_ColorText(CT);
	addstr(" : annuler le mouvement");
	move(15, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_haut);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers le haut");
	move(16, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_bas);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers le bas");
	move(17, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_droite);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers la droite");
	move(18, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_gauche);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers la gauche");
	refresh();
}

/* Fonction affichant l'écran d'édition
*/
void pou_display_editor(POU_CASE_T matrix[POU_MAT_X][POU_MAT_Y], POU_INF_T *inf) {
	clear();
	/* Titre */
	afficher_titre(TITRE_POUSSE_CAISSE);
	/* Matrice */
	pou_display_matrix(matrix);
	/* Informations sur le jeu */
	move(27, x_begin_center(50) - 27);
	CSLP_ColorText(COLOR_RED);
	afficher_char_bullet(1);
	CSLP_ColorText(CT);
	addstr("Jeu :\n");
	getyx(stdscr, inf->pos_inf.y, inf->pos_inf.x);
	pou_refresh_editor_inf(inf);
	/* Légende */
	pou_display_legend();
	/* Liste des touches */
	move(14, x_begin_center(50) - 27);
	CSLP_ColorText(COLOR_RED);
	afficher_char_bullet(1);
	CSLP_ColorText(CT);
	addstr("Liste des touches :");
	CSLP_ColorText(COLOR_RED);
	mvprintw(15, x_begin_center(50) - 25, "%c",  POU_KEY_QUIT);
	CSLP_ColorText(CT);
	addstr(" : Quitter");
	CSLP_ColorText(COLOR_RED);
	mvprintw(16, x_begin_center(50) - 25, "%c", POU_KEY_EMUR);
	CSLP_ColorText(CT);
	addstr(" : Ajouter un mur");
	CSLP_ColorText(COLOR_RED);
	mvprintw(17, x_begin_center(50) - 25, "%c", POU_KEY_ETROU);
	CSLP_ColorText(CT);
	addstr(" : Ajouter un trou");
	CSLP_ColorText(COLOR_RED);
	mvprintw(18, x_begin_center(50) - 25, "%c", POU_KEY_ECAISSE);
	CSLP_ColorText(CT);
	addstr(" : Ajouter une caisse");
	CSLP_ColorText(COLOR_RED);
	mvprintw(19, x_begin_center(50) - 25, "%c", POU_KEY_EJOUEUR);
	CSLP_ColorText(CT);
	addstr(" : Placer le joueur");
	CSLP_ColorText(COLOR_RED);
	mvprintw(20, x_begin_center(50) - 25, "%c", POU_KEY_EVIDE);
	CSLP_ColorText(CT);
	addstr(" : Vider la case");
	move(15, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_haut);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers le haut");
	move(16, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_bas);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers le bas");
	move(17, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_droite);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers la droite");
	move(18, x_begin_center(50) + 60);
	CSLP_ColorText(COLOR_RED);
	afficher_touche(touche_gauche);
	CSLP_ColorText(CT);
	addstr(" : Se déplacer vers la gauche");

	refresh();
}

/* Fonction affichant la matrice
*/
void pou_display_matrix(POU_CASE_T matrix[POU_MAT_X][POU_MAT_Y]) {
	int y, x;

	for(y = 0; y < POU_MAT_Y; y++) {
		move(POU_MAT_ORG_Y + y, POU_MAT_ORG_X);

		for(x = 0; x < POU_MAT_X; x++) {
			pou_display_case(matrix[x][y]);
		}
	}
}

/* Fonction affichant la légende
*/
void pou_display_legend() {
	move(5, x_begin_center(50) - 27);
	CSLP_ColorText(COLOR_RED);
	afficher_char_bullet(1);
	CSLP_ColorText(CT);
	addstr("Legende :");
	/* Joueur */
	move(6, x_begin_center(50) - 25);
	pou_display_case(POU_JOUEUR);
	CSLP_ColorText(CT);
	addstr(" : Vous");
	move(getcury(stdscr), x_begin_center(50) + 60);
	pou_display_case(POU_JOUEUR | POU_TROU);
	CSLP_ColorText(CT);
	addstr(" : Vous sur un trou");
	/* Caisse */
	move(7, x_begin_center(50) - 25);
	pou_display_case(POU_CAISSE);
	CSLP_ColorText(CT);
	addstr(" : Une caisse");
	move(getcury(stdscr), x_begin_center(50) + 60);
	pou_display_case(POU_CAISSE | POU_TROU);
	CSLP_ColorText(CT);
	addstr(" : Une caisse sur un trou");
	/* Trou */
	move(8, x_begin_center(50) - 25);
	pou_display_case(POU_TROU);
	CSLP_ColorText(CT);
	addstr(" : Un trou");
	/* Mur */
	move(9, x_begin_center(50) - 25);
	pou_display_case(POU_MUR);
	CSLP_ColorText(CT);
	addstr(" : Un mur");
}

/* Fonction rafraichissant les information sur le jeu
*/
void pou_refresh_inf(POU_INF_T *inf) {
	CSLP_ColorText(CT);
	mvprintw(inf->pos_inf.y, x_begin_center(50) - 25, "Vous avez fait %i déplacement%s", inf->nb_deplacements, (inf->nb_deplacements > 1 ? "s." : "."));
	mvprintw(inf->pos_inf.y + 1, x_begin_center(50) - 25, "Il reste %i caisse%s sur %i caisse%s à ranger. ",
					 inf->nb_caisses_restantes,
					 (inf->nb_caisses_restantes > 1 ? "s" : ""),
					 inf->nb_caisses,
					 (inf->nb_caisses > 1 ? "s" : ""));
	refresh();
}

/* Fonction rafraichissant les informations sur l'édition en cours
*/
void pou_refresh_editor_inf(POU_INF_T *inf) {
	move(inf->pos_inf.y, inf->pos_inf.x);
	clear_line();
	CSLP_ColorText(CT);
	printw("\t%i caisses et ont été placées ", inf->nb_caisses);

	if(inf->nb_trous < inf->nb_caisses) {
		printw("et il manque %i trous. ", inf->nb_caisses - inf->nb_trous);
	}
	else if(inf->nb_trous > inf->nb_caisses) {
		printw("et il manque %i caisses. ", inf->nb_trous - inf->nb_caisses);
	}
	else {
		printw("et %i trous ont été placé. ", inf->nb_trous);
	}

	if(inf->pos_joueur.x < 0 || inf->pos_joueur.y < 0) {
		addstr("Le joueur n'est pas placé.");
	}
	else {
		addstr("Le joueur est placé.");
	}
}

/* Fonction rafraichissant la valeur d'une case
*/
void pou_refresh_case(IPoint *pos, POU_CASE_T value) {
	if(pos != NULL) {
		move(pos->y + POU_MAT_ORG_Y, pos->x + POU_MAT_ORG_X);
	}

	pou_display_case(value);
	refresh();
}

/* Fonction rafraichissant les valeurs des cases d'un coup
*/
void pou_refresh_coup(POU_COUPS_T *coup) {
	pou_refresh_case(coup->prev_player_pos, *coup->prev_player_cel);
	pou_refresh_case(coup->cur_player_pos, *coup->cur_player_cel);

	if(coup->cur_caisse_cel != NULL) {
		pou_refresh_case(coup->cur_caisse_pos, *coup->cur_caisse_cel);
	}
}

/* Fonction permettant d'afficher une case
*/
void pou_display_case(POU_CASE_T cel) {
	if(cel == POU_MUR) {
		CSLP_ColorText(POU_COL_MUR);
		addstr(POU_WCH_MUR);
	}
	else if(cel == POU_VIDE) {
		CSLP_ResetColors();
		addch(' ');
	}
	else if(cel & POU_JOUEUR) {
		if(cel & POU_TROU) {
			CSLP_ColorText(POU_COL_JOUEUR_TROU);
		}
		else {
			CSLP_ColorText(POU_COL_JOUEUR);
		}

		addstr(POU_WCH_JOUEUR);
	}
	else if(cel & POU_CAISSE) {
		if(cel & POU_TROU) {
			CSLP_ColorText(POU_COL_CAISSE_TROU);
		}
		else {
			CSLP_ColorText(POU_COL_CAISSE);
		}

		addstr(POU_WCH_CAISSE);
	}
	else if(cel == POU_TROU) {
		CSLP_ColorText(POU_COL_TROU);
		addstr(POU_WCH_TROU);
	}
}
